package zhouyang;

import java.util.concurrent.TimeUnit;

class  MyData{
  volatile   int num = 0;
    public void addTo60(){
        this.num = 60;
    }
public void addPlusPlus(){
        this.num++;
    }
}

/**
 * 1验证volatile的可见性
 * num = 0，num变量之前没有添加volatile关键字修饰,没有可见性
 * 添加了volatile，可以解决可见性问题
 * 2验证volatile不保证原子性
 * 原子性；不可分割，完整性，也就是某个线程在做某个具体业务时，中间不可以被加塞或分隔，需要整体完整
 */
public class VolatileDemo {
    public static void main(String[] args) {
//        seeOkByVolatile();
        MyData myData = new MyData();
        for (int i = 1; i <=20; i++) {
            new Thread(()->{
                for (int j = 1; j <1000; j++) {
                    myData.addPlusPlus();
                }
            },String.valueOf(i)).start();
        }
//        等上面20个线程全部计算完成后，再用main线程取得最终结果
        while (Thread.activeCount()>2){
            Thread.yield();//大于2表示上面的线程没运行完，2表示一个main线程，一个gc线程
        }
        System.out.println(Thread.currentThread().getName()+"\t finally num value:"+myData.num);
    }
    public static void seeOkByVolatile (){
        MyData myData = new MyData();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t come in");
            try {
                TimeUnit.SECONDS.sleep(3);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            myData.addTo60();
            System.out.println(Thread.currentThread().getName()+"\t updated num value:"+myData.num);
        },"AAA").start();
        while (myData.num ==0){

        }
        System.out.println(Thread.currentThread().getName()+"\t mission is over,main get num value:"+myData.num);

    }
}
